#!/bin/sh

ParallelsDesktop30Uninstaller="${1}/Contents/Resources/pd30uninstaller.h"

if [ -e "/Library/Parallels/Parallels Service.app/Contents/Resources/Uninstaller.sh" ]; then
	ParallelsUninstallerScript="/Library/Parallels/Parallels Service.app/Contents/Resources/Uninstaller.sh"
elif [ -e "/Library/Parallels/Parallels Server.app/Contents/Resources/Uninstaller.sh" ]; then
	ParallelsUninstallerScript="/Library/Parallels/Parallels Server.app/Contents/Resources/Uninstaller.sh"
else
	ParallelsUninstallerScript="${1}/Contents/Resources/ps30uninstaller.h"
fi

CheckProcessRunning()
{
	! ps -w -w -A -ocommand 2>/dev/null | grep -nq "^${1}"
}

# Check for installed Parallels Desktop 3.0 and uninstall it
if [ -d '/System/Library/Extensions/hypervisor.kext' ] || \
	[ -d '/Incompatible Software/hypervisor.kext' ]; then
	# Check no PD3 vm running
	if ! CheckProcessRunning "Parallels\( Desktop\)\?.app/Contents/MacOS/[P]arallels"; then
		exit 113
	fi

	# Check no PD3 applications running
	if ! CheckProcessRunning "Parallels\( Desktop\)\?.app/Contents/MacOS/[P]arallels"; then
		exit 113
	fi

	if ! CheckProcessRunning "\(Parallels Image \)\?Tool.app/Contents/MacOS/[I]mage[T]ool" ; then
		exit 113
	fi

	if ! CheckProcessRunning "Parallels Transporter.app/Contents/MacOS/" ; then
		exit 113
	fi

	if ! CheckProcessRunning "Parallels Explorer.app/Contents/MacOS/" ; then
		exit 113
	fi

	"${ParallelsDesktop30Uninstaller}"
fi
if [ -d '/System/Library/Extensions/hypervisor.kext' ] || \
	[ -d '/Incompatible Software/hypervisor.kext' ]; then
	exit 112
fi

# Copy receipts to place where Uninstaller expect 'em
logger -p install.info -t 'Parallels' "Snow Leopard receipts switcheroo section"
if [ -d "/var/db/receipts" ]; then
	logger -p install.info -t 'Parallels' "Will copy receipts"
	receipts_old_dir="/Library/Parallels/Parallels Service.app/Contents/Receipts"
	receipts_dir="/var/db/receipts"
	pd4_receipt_old="${receipts_old_dir}/Parallels Desktop 4.pkg/Contents/Archive.bom"
	pd4_receipt="${receipts_dir}/com.parallels.desktop.bom"
	pe4_receipt_old="${receipts_old_dir}/Parallels Explorer 4.pkg/Contents/Archive.bom"
	pe4_receipt="${receipts_dir}/com.parallels.desktop.explorer.bom"
	pit4_receipt_old="${receipts_old_dir}/Parallels Image Tool 4.pkg/Contents/Archive.bom"
	pit4_receipt="${receipts_dir}/com.parallels.server.imagetool.bom"
	pt4_receipt_old="${receipts_old_dir}/Parallels Transporter 4.pkg/Contents/Archive.bom"
	pt4_receipt="${receipts_dir}/com.parallels.server.transporter.bom"
	pdr106_receipt_old="${receipts_old_dir}/Parallels Drivers 10.6.pkg/Contents/Archive.bom"
	pdr106_receipt="${receipts_dir}/com.parallels.desktop.drivers.106"

	# Desktop package
	if [ -e "${pd4_receipt_old}" -a ! -e "${pd4_receipt}" ]; then
		cp -f "${pd4_receipt_old}" "${pd4_receipt}"
		logger -p install.info -t 'Parallels' "Receipt desktop copied with status $?"
	fi

	# Explorer package
	if [ -e "${pe4_receipt_old}" -a ! -e "${pe4_receipt}" ]; then
		cp -f "${pe4_receipt_old}" "${pe4_receipt}"
		logger -p install.info -t 'Parallels' "Receipt explorer copied with status $?"
	fi

	# Image Tool package
	if [ -e "${pit4_receipt_old}" -a ! -e "${pit4_receipt}" ]; then
		cp -f "${pit4_receipt_old}" "${pit4_receipt}"
		logger -p install.info -t 'Parallels' "Receipt imagetool copied with status $?"
	fi

	# Transporter package
	if [ -e "${pt4_receipt_old}" -a ! -e "${pt4_receipt}" ]; then
		cp -f "${pt4_receipt_old}" "${pt4_receipt}"
		logger -p install.info -t 'Parallels' "Receipt transporter copied with status $?"
	fi

	# Drivers 10.6 package
	if [ -e "${pdr106_receipt_old}" -a ! -e "${pdr106_receipt}" ]; then
		cp -f "${pdr106_receipt_old}" "${pdr106_receipt}"
		logger -p install.info -t 'Parallels' "Receipt drivers 10.6 copied with status $?"
	fi
fi

if [ -d "/Library/Receipts/Install Parallels Server.pkg" ] || \
   [ -d "/Library/Receipts/Parallels Server 3.pkg" ] || \
   [ -d "/Library/Parallels/Parallels Service.app/Contents/Receipts/Parallels Server 3.pkg" ] || \
   [ -d "/Library/Parallels/Receipts/Parallels Server 4.pkg" ] || \
   [ -d "/Library/Parallels/Receipts/Parallels Server.pkg" ] || \
   [ -f "/var/db/receipts/com.parallels.pkg.server.service.plist" ] || \
   [ -f "/var/db/receipts/com.parallels.server.server.plist" ]; then
	"${ParallelsUninstallerScript}" server
fi

check_service_ver()
{
	plist_file="/Library/Parallels/Parallels Service.app/Contents/Info.plist"
	grep -s -A 1 CFBundleShortVersionString "$plist_file" | grep -q "${1}\.0"
	return $?
}

get_parallels_version()
{
	plist_file="/Library/Parallels/Parallels Service.app/Contents/Info.plist"
	parallels_ver=$(grep -s -A 1 CFBundleVersion "$plist_file" | tail -n 1 | sed 's/.*string>\(.*\)<\/string.*/\1/')
	echo "$parallels_ver"
}

check_pd_ver_installed()
{
	if [ -d "/Library/Receipts/Parallels Desktop ${1}.pkg" \
		   -o -d "/Library/Parallels/Parallels Service.app/Contents/Receipts/Parallels Desktop ${1}.pkg" \
		   -o -d "/Library/Parallels/Receipts/Parallels Desktop.pkg" \
		   -o -f "/var/db/receipts/com.parallels.desktop.plist"\
		   -o -f "/var/db/receipts/com.parallels.pkg.desktop.plist" ]; then
		check_service_ver "$1"
		return $?
	fi

	return 1
}

if check_pd_ver_installed 4; then
	"${ParallelsUninstallerScript}" desktop
elif check_pd_ver_installed 5; then
	"${ParallelsUninstallerScript}" --keep-video desktop
fi

check_stm_ver_installed()
{
	if [ -d "/Library/Receipts/Parallels Switch To Mac ${1}.pkg" \
		   -o -f "/var/db/receipts/com.parallels.stm.plist" \
		   -o -d "/Library/Parallels/Receipts/Parallels Switch To Mac.pkg" \
		   -o -d "/Library/Parallels/Parallels Service.app/Contents/Receipts/Parallels Switch To Mac ${1}.pkg" ]; then
		check_service_ver "$1"
		return $?
	fi

	return 1
}

if check_stm_ver_installed 4; then
	"${ParallelsUninstallerScript}" --keep-video stm
elif check_stm_ver_installed 5; then
	"${ParallelsUninstallerScript}" --keep-stm-stuff stm
fi

# New Uninstaller
new_uninstaller="/Library/Parallels/Uninstaller/Parallels Hypervisor/Uninstaller.sh"
if [ -x "$new_uninstaller" ]; then

	parallels_version=$(get_parallels_version | cut -d '.' -f 1)
	if [[ $parallels_version == "11800" ]]; then
		# FIXME There is a bug in PD6.RTM Uninstaller update mode, update mode removes PTA and LYM
		# This should be removed in newer versions, only --update mode will stay
		"$new_uninstaller" --update --keep-stm-stuff
	else
		"$new_uninstaller" --update
	fi
fi

# Try to unload MacFUSE kext
kextunload -b com.google.filesystems.fusefs

# Clean up kexts of PD <= 4.0.3810
sys_kext_dir=/System/Library/Extensions
prl_kexts='
prl_hypervisor.kext
prl_hid_hook.kext
prl_netbridge.kext
prl_usb_connect.kext
prl_vnic.kext
'
for kext in $prl_kexts; do
	kext=${sys_kext_dir}/${kext}
	test -d "$kext" && rm -rf "$kext"
done
touch "$sys_kext_dir"

exit 0
